package com.example.demo.controller;


import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *  使用注解操作 Redis.
 *
 *  1. @Cacheable: 查询/添加. 判断 redis 是否有缓存, 如果没有就把当前方法返回值存到 redis,
 *                 如果存在缓存直接返回.
 *  2. @CachePut: 修改. 将方法返回值更新到 redis 缓存中.
 *  3. @CacheEvict: 删除. 将 redis 中对应的缓存删除.
 *
 *  a. 使用注解操作 Redis 要在启动类上开启全局注解缓存.
 *  b. 使用注解实现缓存操作
 */

@RestController
@RequestMapping("/cache")
public class RedisCacheController {

    /**
     * 1. @Cacheable 存储或读取 redis 缓存
     * @param name redis 中的参数1
     * @param pnumber redis 中的参数2
     * @return 存储的 redis 中的 value
     */
    @RequestMapping("/get")
            // # 表示获取参数, - 是两个参数的分隔符, 两个参数用 + + 隔开
    @Cacheable(value = "spring:cache", key = "#name+'-'+#pnumber")
    public String get(String name, String pnumber) {
        if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
            return null;
        }
        System.out.println("执行了 redis 缓存");
        return "name = " + name + " | pnumber = " + pnumber;
    }

    /**
     *  2. @CacheEvict 删除缓存
     */
    @RequestMapping("/del")
    @CacheEvict(value = "spring:cache", key = "#name+'-'+#pnumber")
    public void delete(String name, String pnumber) {
        System.out.println("执行了缓存删除");
    }

    /**
     *   redis 缓存更新
     */
    @RequestMapping("/upd")
    @CachePut(value = "spring:cache", key = "#name+'-'+#pnumber")
    public String upd(String name, String pnumber) {
        if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
            return null;
        }
        System.out.println("执行了更新 redis 缓存");
        return "name = " + name + "-pnumber = " + pnumber;
    }
}
